package sop_rmi;

import servidor_canciones.FileListFilter;
import cliente.Cancion_Impl;
import cliente.Cancion_Int;
import cliente.Lista_Impl;
import cliente.Lista_Int;
import java.io.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author Luis Ordoñez
 */

public class Impl_Canciones extends UnicastRemoteObject implements Int_Canciones 
{
    public Impl_Canciones() throws RemoteException
    {
    }
      
    @Override
    public boolean CrearLista(Lista_Int Lista) throws RemoteException  {
        int numero_lista;
        
        File raiz = new File("../src/servidor_canciones/listas/"); 
        FilenameFilter select = new FileListFilter(Lista.getLogin(), "txt");    //creo un filtro para la busqueda de los archivos
        File[] archivos =null;                               //seleccionos los archivos con el filtro
        archivos = raiz.listFiles(select);
        if (archivos.length != 0)                                           //si hay archicos para este login
        {
            String nombre = archivos[archivos.length-1].getName();      //esojo el ultimo y l eextraigo el nombre
            int longitud=nombre.length();
            String n = nombre.substring(longitud-7,longitud-4);         //extraigo el numero de lista
            numero_lista=Integer.parseInt(n);
        }
        else numero_lista =0;                                           // sino hay harchivos para este login el numero de la lista es 0
        Lista.setNumero(numero_lista+1);
        Random rnd = new Random();
        for(int x=0;x<(Lista.getCanciones()).size();x++)
            Lista.getCanciones().get(x).setCodigo(rnd.nextInt(9999)+1);
        
        if (Crear_Lista(Lista))return true;
        else return false;
    }
    public boolean Crear_Lista(Lista_Int Lista)  {
        String n_l=Integer.toString(Lista.getNumero());
        String Nombre_de_la_lista;
        int n=n_l.length();
        if (n==1)n_l="00"+n_l;
        if (n==2)n_l="0"+n_l;
                
        Nombre_de_la_lista="../src/servidor_canciones/listas/"+Lista.getLogin()+"_lista_"+n_l+".txt";     // concateno el nombre de la nueva lista 
        FileWriter fw = null;	 // la extension al archivo 
        try {
            fw = new FileWriter(Nombre_de_la_lista,false);
        } catch (IOException ex) {
            Logger.getLogger(Impl_Canciones.class.getName()).log(Level.SEVERE, null, ex);
        }        
        
        BufferedWriter bw = new BufferedWriter(fw); 
        PrintWriter salArch = new PrintWriter(bw);
//        {
            for(int x=0;x<(Lista.getCanciones()).size();x++)
                salArch.println(Lista.getCanciones().get(x).getTitulo()+"\t"+
                                Lista.getCanciones().get(x).getAlbum()+"\t"+
                                Lista.getCanciones().get(x).getArtista()+"\t"+
                                Lista.getCanciones().get(x).getGenero()+"\t"+
                                Lista.getCanciones().get(x).getDuracion()+"\t"+
                                Lista.getCanciones().get(x).getTamanio()+"\t"+
                                Lista.getCanciones().get(x).getCodigo()
                               );
            salArch.close();
//        } 
        return true;
    }
    
    @Override
    public boolean AgregarCancion(String Login, int numLista, Cancion_Int Cancion) throws RemoteException  {
        Random rnd = new Random();
        Cancion.setCodigo(rnd.nextInt(9999)+1);
        
        if (Agregar_Cancion(Login,numLista,Cancion))
            return true;
        else 
            return false;      
    }
    private boolean Agregar_Cancion(String Login, int numLista, Cancion_Int Cancion) {
        String n_l=Integer.toString(numLista);
        int n=n_l.length();
        if (n==1)n_l="00"+n_l;
        if (n==2)n_l="0"+n_l;       
        
        String Nombre_de_la_lista;
        Nombre_de_la_lista=Login+"_lista_"+n_l+".txt";
                
        File raiz = new File("../src/servidor_canciones/listas/"); 
        FilenameFilter select = new FileListFilter(Nombre_de_la_lista, "txt");    //creo un filtro para la busqueda de los archivos
        File[] archivos = raiz.listFiles(select);                               //seleccionos los archivos con el filtro
        
        if (archivos.length == 0) return false;                                      // la lista no existe
        
         BufferedWriter out = null;                                              //si el archivo existe ingreso la cancion
        try {out = new BufferedWriter(new FileWriter("../src/servidor_canciones/listas/"+Nombre_de_la_lista,true));} 
        catch (IOException ex) {Logger.getLogger(Impl_Canciones.class.getName()).log(Level.SEVERE, null, ex);}       
        PrintWriter salArch = new PrintWriter(out); 
        salArch.println(Cancion.getTitulo()+"\t"+Cancion.getAlbum()+"\t"+
                        Cancion.getArtista()+"\t"+Cancion.getGenero()+"\t"+
                        Cancion.getDuracion()+"\t"+Cancion.getTamanio()+"\t"+
                        Cancion.getCodigo()
                        );  
        salArch.close();                         
        return true;
    }
    
    @Override
    public ArrayList<Cancion_Impl> BuscarCancion (String Login, int numLista, Cancion_Int Cancion) throws RemoteException   {
        ArrayList<Cancion_Impl> canciones =new ArrayList();
        String n_l=Integer.toString(numLista);
        int n=n_l.length();
        if (n==1)n_l="00"+n_l;
        if (n==2)n_l="0"+n_l;       
        
        String Nombre_de_la_lista;
        Nombre_de_la_lista=Login+"_lista_"+n_l;
                   
        File raiz = new File("../src/servidor_canciones/listas/"); 
        FilenameFilter select = new FileListFilter(Nombre_de_la_lista, "txt");    //creo un filtro para la busqueda de los archivos
        File[] archivos = raiz.listFiles(select);                               //seleccionos los archivos con el filtro
        
        if (archivos.length == 0) return null;                                      // la lista no existe

        BufferedReader in = null;                                              //si el archivo existe ingreso la cancion
        try {in = new BufferedReader(new FileReader("../src/servidor_canciones/listas/"+Nombre_de_la_lista+".txt"));}
        catch (FileNotFoundException ex) {return null;}
        String Cadena;
                
        try 
        {
            while ((Cadena = in.readLine())!=null) 
            {
                Cancion_Impl can = new Cancion_Impl();             
                String [] campos = Cadena.split("\t");
                
                if (Cancion.getTitulo()!=null)
                    if(Cancion.getTitulo().equals(campos[0]))
                    {
//                        System.out.println("entro al buscar por titulo");
                        can.setTitulo(campos[0]);
                        can.setAlbum(campos[1]);
                        can.setArtista(campos[2]);
                        can.setGenero(campos[3]);
                        can.setDuracion(campos[4]);
                        can.setTamanio(campos[5]);
                        can.setCodigo(Integer.parseInt(campos[6]));
                        canciones.add(can);
                    }    
                if(Cancion.getArtista()!=null) 
                    if(Cancion.getArtista().equals(campos[2]))
                    {
//                        System.out.println("entro al buscar por artista");
                        can.setTitulo(campos[0]);
                        can.setAlbum(campos[1]);
                        can.setArtista(campos[2]);
                        can.setGenero(campos[3]);
                        can.setDuracion(campos[4]);
                        can.setTamanio(campos[5]);
                        can.setCodigo(Integer.parseInt(campos[6]));
                        canciones.add(can);
                    }
                if(Cancion.getCodigo()==Integer.parseInt(campos[6])) 
                    {
//                        System.out.println("entro al buscar por artista");
                        can.setTitulo(campos[0]);
                        can.setAlbum(campos[1]);
                        can.setArtista(campos[2]);
                        can.setGenero(campos[3]);
                        can.setDuracion(campos[4]);
                        can.setTamanio(campos[5]);
                        can.setCodigo(Integer.parseInt(campos[6]));
                        canciones.add(can);
                    } 
            }
        } catch (IOException ex) {Logger.getLogger(Impl_Canciones.class.getName()).log(Level.SEVERE, null, ex);}
        try {
            in.close();
        } catch (IOException ex) {
            Logger.getLogger(Impl_Canciones.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return canciones;
    }

    @Override
    public Lista_Impl DesplegarLista(String Login, int numLista) throws RemoteException  {
        Lista_Impl lista =new Lista_Impl();
        ArrayList<Cancion_Impl> canciones = new ArrayList();
        
        String cadena;
        String n_l=Integer.toString(numLista);
        int n=n_l.length();
        if (n==1)n_l="00"+n_l;
        if (n==2)n_l="0"+n_l; 
        BufferedReader bf=null;
        try {
            bf = new BufferedReader(new FileReader("../src/servidor_canciones/listas/"+Login+"_lista_"+n_l+".txt"));
        } catch (FileNotFoundException ex) {return null;}
        
        try 
        {  
            while ((cadena = bf.readLine())!=null)
            {
                Cancion_Impl can =new Cancion_Impl();
                String [] campos = cadena.split("\t");
                can.setTitulo(campos[0]);
                can.setAlbum(campos[1]);
                can.setArtista(campos[2]);
                can.setGenero(campos[3]);
                can.setDuracion(campos[4]);
                can.setTamanio(campos[5]);
                can.setCodigo(Integer.parseInt(campos[6]));
                canciones.add(can);
            }
        } catch (IOException ex) {Logger.getLogger(Impl_Canciones.class.getName()).log(Level.SEVERE, null, ex);}
        try {
            bf.close();
        } catch (IOException ex) {
            Logger.getLogger(Impl_Canciones.class.getName()).log(Level.SEVERE, null, ex);
        }
        lista.setLogin(Login);
        lista.setNumero(numLista);
        lista.setCanciones(canciones);
        return lista;
    }

    @Override
    public boolean EliminarLista(String Login, int numLista) throws RemoteException  {
        if (Eliminar_Lista(Login,numLista))return true;
        else return false;
    }
    public boolean Eliminar_Lista(String Login, int numLista){
        String n_l=Integer.toString(numLista);
        int n=n_l.length();
        if (n==1)n_l="00"+n_l;
        if (n==2)n_l="0"+n_l;
        
        File fichero = new File("../src/servidor_canciones/listas/"+Login+"_lista_"+n_l+".txt");
        if(fichero.delete()) return true;
        else return false;
    }
    
    @Override
    public boolean EliminarCancion(String Login, int numLista, Cancion_Int Cancion) throws RemoteException {
        if (Eliminar_Cancion(Login,numLista,Cancion)) return true;
        else return false;
    }
    public boolean Eliminar_Cancion (String Login, int numLista, Cancion_Int Cancion){
        String n_l=Integer.toString(numLista);
        int n=n_l.length();
        if (n==1)n_l="00"+n_l;
        if (n==2)n_l="0"+n_l;       
        
        String Nombre_de_la_lista;
        Nombre_de_la_lista=Login+"_lista_"+n_l;
                
        File raiz = new File("../src/servidor_canciones/listas/"); 
        FilenameFilter select = new FileListFilter(Nombre_de_la_lista, "txt");    //creo un filtro para la busqueda de los archivos
        File[] archivos = raiz.listFiles(select);                               //seleccionos los archivos con el filtro
//        System.out.println("antes");
        if (archivos.length == 0 ) return false;  
//        System.out.println("hasta ca");
        BufferedReader in = null;                                              //si el archivo existe ingreso la cancion
        try {in = new BufferedReader(new FileReader("../src/servidor_canciones/listas/"+Nombre_de_la_lista+".txt"));}
        catch (FileNotFoundException ex) {return false;}
//        System.out.println("mas abajo");
        String Cadena;
        ArrayList<Cancion_Impl>  canciones = new ArrayList(); 
       
        try 
        {
            while ((Cadena = in.readLine())!=null) 
            {
                Cancion_Impl can = new Cancion_Impl();             
                String [] campos = Cadena.split("\t");

                    if(Cancion.getCodigo()!=Integer.parseInt(campos[6]))
                    {
                        can.setTitulo(campos[0]);
                        can.setAlbum(campos[1]);
                        can.setArtista(campos[2]);
                        can.setGenero(campos[3]);
                        can.setDuracion(campos[4]);
                        can.setTamanio(campos[5]);
                        can.setCodigo(Integer.parseInt(campos[6]));
                        canciones.add(can);
                    }    
            }
        } catch (IOException ex) {Logger.getLogger(Impl_Canciones.class.getName()).log(Level.SEVERE, null, ex);}
        try {
            in.close();
        } catch (IOException ex) {
            Logger.getLogger(Impl_Canciones.class.getName()).log(Level.SEVERE, null, ex);
        }
        Lista_Impl lista =new Lista_Impl();
        lista.setNumero(numLista);
        lista.setLogin(Login);
        lista.setCanciones(canciones);
//        System.out.println("Login    : "+Login);
//        System.out.println("numLista : "+numLista);
        if (Eliminar_Lista(Login,numLista)) 
            if (Crear_Lista(lista))
                return true;
        return false;
    }

    @Override
    public boolean ModificarCancion(String Login, int numLista, Cancion_Int Cancion) throws RemoteException {
        if (Eliminar_Cancion(Login,numLista,Cancion))
            if (Agregar_Cancion(Login,numLista,Cancion))
                return true;
        return false;
                
    }
}
